﻿package {
	////可视化相关类
	import flash.display.Sprite;
	//声音相关类
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.media.SoundLoaderContext;
	import flash.media.SoundMixer;
	import flash.media.SoundTransform;
	//事件类
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.EventDispatcher;
	//加载相关类
	import flash.net.URLRequest;
	//文本框相关类
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	
	//类及变量声明
	//======================================================================================//
	public class KingPlay extends Sprite {
		//媒体列表
		private var playList:Array;
		//声音对象
		private var playSound:Sound;
		//声音控制对象
		private var playSoundChannel:SoundChannel;
		//是否正在播放
		private var isPlay:Boolean;
		//媒体地址
		private var _playURL:String;
		//当前播放的媒体名字
		private var _playName:TextField=new TextField();
		//匹配歌词地址
		private var _lrc:String;
		//播放媒体在列表中ID
		private var _playID:int=0;
		//播放头
		private var playTime:Number;
		//循环模式
		//1为列表循环（默认），2为单曲循环
		private var _cycMode:int=1;
		//自动播放模式
		//1为顺序播放（默认），2为随机播放
		private var _autoMode:int=1;
		//每次加载并播放时调用的事件
		public const LOADPALY:String="loadplay";


		//======================================================================================//
		//构造函数
		public function KingPlay() {
			init();
		}
		//初始化
		private function init() {
			_playName.selectable=false;
			_playName.autoSize=TextFieldAutoSize.LEFT;
		}
		//
		//======================================================================================//
		/**
		//提供给外部设置的属性
		**/
		//================================================》
		//列表绑定（绑定后才真正运行）
		public function set listArray(arr:Array) {
			playList=arr;
			load(playList[_playID].url);
		}
		//================================================》
		//循环模式
		public function set cycMode(cycMode:int) {
			_cycMode=cycMode;
		}
		//================================================》
		//自动播放模式
		public function set autoMode(autoMode:int) {
			_autoMode=autoMode;
		}
		//  
		//======================================================================================//
		/**
		//提供给外部的只读属性
		**/
		//================================================》
		//声音对象
		public function get sound():Sound {
			return playSound;
		}
		//================================================》
		//声音控制对象
		public function get channel():SoundChannel {
			return playSoundChannel;
		}
		//================================================》
		//匹配媒体的歌词文件URL
		public function get lrc():String {
			return _lrc;
		}
		//================================================》
		//媒体在列表中的ID
		public function get playID():uint {
			return _playID;
		}
		// 
		//======================================================================================//
		/**
		//提供给外部方法
		**/
		//================================================》
		//获取媒体名（为一文本框）
		public function getPlayName():TextField {
			return _playName;
		}
		//================================================》
		//设置音量
		public function setVolume(num:Number) {
			var _volume:SoundTransform=new SoundTransform(num,0);
			playSoundChannel.soundTransform=_volume;
		}
		//================================================》
		//加载歌曲
		public function load(playURL:String) {
			//先停止所有声音
			SoundMixer.stopAll();
			//新建声音
			playSound=new Sound() ;
			_playURL=playURL;
			//加载（缓冲5秒）
			playSound.load(new URLRequest(_playURL),new SoundLoaderContext(5000,true));
			//加载错误时调用
			playSound.addEventListener(IOErrorEvent.IO_ERROR,loadErr);
			//播放声音
			playSoundChannel=playSound.play();
			//播放状态
			isPlay=true;
			//匹配歌词
			_lrc=searchLRC(_playURL);
			//当前媒体在列表的ID位置
			_playID=searchID(_playURL);
			//更新歌媒体名
			upPlayName();
			//对外部广播加载并播放声音后的事件
			dispatchEvent(new Event(LOADPALY));
			//声音播放完毕
			playSoundChannel.addEventListener(Event.SOUND_COMPLETE,soundComplete);
		}
		/**
		以下方法为控制媒体播放状态
		**/
		//================================================》
		//定位到指定时间播放
		public function goto(time:Number) {
			playSoundChannel.stop();
			playSoundChannel=playSound.play(time);
			playSoundChannel.addEventListener(Event.SOUND_COMPLETE,soundComplete);
			isPlay=true;
		}
		//================================================》
		//播放
		public function play() {
			if (! isPlay) {
				playSoundChannel=playSound.play(playTime);
				playSoundChannel.addEventListener(Event.SOUND_COMPLETE,soundComplete);
				isPlay=! isPlay;
			}
		}
		//================================================》
		//暂停
		public function pause() {
			if (isPlay) {
				playTime=playSoundChannel.position;
				playSoundChannel.stop();
				isPlay=! isPlay;
			}
		}
		//================================================》
		//停止
		public function stop() {
			if (isPlay) {
				playTime=0;
				playSoundChannel.stop();
				isPlay=! isPlay;
			}
		}
		//================================================》
		//下一首
		public function next() {
			if (_cycMode==1) {
				if (_autoMode==1) {
					//顺序循环
					if (playID<playList.length-1) {
						playSoundChannel.stop();
						_playID++;
						load(playList[_playID].url);
					} else {
						playSoundChannel.stop();
						_playID=0;
						load(playList[_playID].url);
					}//END IF
				} else {
					//随机循环
					_playID=Math.floor(Math.random()*(playList.length-1));
					playSoundChannel.stop();
					load(playList[_playID].url);
				}
			} else {
				//单曲循环
				playSoundChannel.stop();
				load(playList[_playID].url);
			}
		}
		//================================================》
		//上一首
		public function last() {
			if (playID>0) {
				playSoundChannel.stop();
				_playID--;
				load(playList[_playID].url);
			} else {
				playSoundChannel.stop();
				_playID=playList.length-1;
				load(playList[_playID].url);
			}
		}
		// 
		//======================================================================================//
		/**
		以下为内部方法
		**/
		//更新歌曲名
		private function upPlayName() {
			var tmpStr:String=playList[_playID].name.toString();
			var len:int=tmpStr.length;
			var tmpLen:int=tmpStr.length>10?tmpLen=10:tmpStr.length;
			//取7个字符防止溢出
			tmpStr=len>10?tmpStr.substr(0,tmpLen)+" ...":tmpStr.substr(0,tmpLen);
			_playName.htmlText="<FONT color='#FFFFFF'>"+tmpStr+"</FONT>";
		}
		//================================================》
		//匹配媒体在列表中的歌词文件
		private function searchLRC(song:String):String {
			for each (var tmp in playList) {
				if (tmp.url==song) {
					return tmp.lrc;
				}
			}
			return "无歌词";
		}
		//================================================》
		//匹配媒体在列表中的ID位置
		private function searchID(song:String):int {
			for (var id:int=0; id<playList.length; id++) {
				if (playList[id].url==song) {
					return id;
				}
			}
			return 0;
		}
		//================================================》
		//媒体播放完毕后自动下一首
		private function soundComplete(e:Event) {
			trace("播放完成")
			playSoundChannel.stop();
			next();
		}
		//================================================》
		//加载媒体失败时，自动下一首
		private function loadErr(evt:IOErrorEvent):void {
			trace("加载歌曲错误")
			next();
		}
	}
}